/*
服务器处理的三种请求
1 计算请求--即处理一个计算task然后返回结果
2 发布订阅请求 -- 即客户端发送一个订阅消息给服务器然后服务器转发给订阅该主题的消息的
其它客户端
3 订阅请求 -- 发送一个订阅请求即比如客户端要订阅一个音乐主题相关的内容，那么当有音乐主题的消息发布了
服务器就推送该消息给该客户端

//自定义协议的中报头应该包括 正文消息的长度字段 、正文消息的类型说明字段是服务调用还是订阅请求什么的，
//该请求的ID号长度字段说明 

*/
#pragma  once
#include<iostream>
#include<string>
#include<unordered_map>
// 宏定义字段字符串方便以后修改
#define KEY_METHOD "method"    // 请求方法类型字段
#define KEY_PRAMAS "params"    // 请求里面的参数字段
#define KEY_Topic "topic"      // 主题字段
#define KEY_Tmsg "topic_msg"   // 消息字段
#define KEY_TOPTYPE "toper_type" // 主题操作符字段
#define KEY_HOST "host"        // 主机名字段
#define KEY_IP "ip"            // 主机ip字段
#define KEY_PORT "port"        // 主机端口字段
#define KEY_CODE "code"        // 客户端响应状态码字段
#define KEY_RESULT "result"    // 计算结果字段
#define KEY_RESULT_TYPE "result_type" //计算结果类型
#define KEY_SerOper "SerOper_type" // 主题操作符字段
// 定义请求和回应的枚举类型
enum class Rs_RqType
{
    RPC_Req = 0, // 远程调用请求
    RPC_Res,     // 远程调用回应
    TOPIC_Req,   // 主题类型请求
    TOPIC_Res,
    Service_Req, // z注册服务类型请求
    Service_Res,
};

// 定义服务端给客户端响应的状态码--即处理请求后的状态是处理失败还是成功
enum class ResCode
{
    ResCode_Ok = 0,
    ResCode_Analyse_Failed,   // 正文解析失败
    ResCode_Invalid_Msg,      // 正文无效
    ResCode_Disconnect,       // 客户端连接断开
    ResCode_Invalid_Params,   // 无效的函数参数
    ResCode_Not_FoundService, // 没有对应的服务提供
    ResCode_INVALID_OPTYPE,//无效的函数操作符
    ResCode_NOT_FOUND_TOPIC,//请求的主题订阅不存在
    ResCode_INTERNAL_ERROR//
};
//把对于的回应状态码转成字符串
static std::string GetResCodeStr(ResCode code)
{
    //定义一个静态局部的哈希表存储映射关系，运行期间只初始化一次，使用列表初始化
    static std::unordered_map<ResCode,std::string> CodeMap(
        {   {ResCode::ResCode_Ok,"处理成功"},
            {ResCode::ResCode_Analyse_Failed,"处理成功"},
            {ResCode::ResCode_Invalid_Msg,"正文无效"},
            {ResCode::ResCode_Disconnect,"客户端断开连接"},
            {ResCode::ResCode_Invalid_Params,"无效的参数"},
            {ResCode::ResCode_Not_FoundService,"没有该服务"},
            {ResCode::ResCode_INVALID_OPTYPE,"无效的操作符"},
            {ResCode::ResCode_NOT_FOUND_TOPIC,"没有该主题的订阅消息"}
        }
    );
    if(CodeMap.count(code))
    {
        return CodeMap[code];
    }
    return "未知错误";
}

//客户端RPC请求方式
enum class CliRpcType
{
    REQ_YSNC,//同步请求，客户端同步（阻塞）等待请求的回应
    REQ_UYSNC,//创建线程去等待服务端的回应-阻塞等待
    REQ_CALLBACK//
};
//主题操作类型定义
enum class TopicOperType
{
    Topic_Create=0,
    Topic_Delete,
    Topic_SubScribe,
    Topic_Cancle_Sub,
    Topic_SendMesg
};

//服务中心的操作类型
enum class ServiceOptype {
SERVICE_Register = 0,//注册服务
SERVICE_Discover,//发现指定服务-查询服务中心哪些主机可以提供该服务
SERVICE_Online,//通知客户端哪些服务上线并且哪些主机提供该服务
SERVICE_Offline,
SERVICE_Unkown
};